package com.workingpub.commons.orm;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.workingpub.commons.domain.Identifiable;

/**
 * 
 * @author taoping
 *
 */
public interface EntityManager {

	/**
	 * 在符合条件的实例存在的情况下，根据给定的实体类和标识返回持久化状态的实例。如果没有对应的实例，则返回null。
	 */
	<P extends Serializable, T extends Identifiable<P>> T get(Class<T> clazz, P id);

	/**
	 * 查找所有的entity
	 */
	<T extends Identifiable<?>> List<T> getAll(Class<T> clazz);

	/**
	 * 保存一个新的entity,并返回唯一标识
	 */
	@Transactional
	<T extends Identifiable<?>> int save(T entity);

	/**
	 * 批量保存多个新的entity,并返回唯一标识
	 * 
	 * @param entities
	 * @return
	 */
	@Transactional
	<T extends Identifiable<?>> int save(T[] entities);

	/**
	 * 批量保存多个新的entity,并返回唯一标识
	 */
	@Transactional
	<T extends Identifiable<?>> int save(Collection<T> entities);

	/**
	 * 更新entity
	 */
	@Transactional
	<T extends Identifiable<?>> int update(T entity);

	/**
	 * 批量更新entity
	 */
	@Transactional
	<T extends Identifiable<?>> int update(T[] entities);

	/**
	 * 批量更新entity
	 */
	@Transactional
	<T extends Identifiable<?>> int update(Collection<T> entities);

	/**
	 * 保存entity,如果数据库中没有对应的记录,则直接插入一条新的记录,如果数据库中已经有对应的记录,则直接更新
	 */
	@Transactional
	<T extends Identifiable<?>> int saveOrUpdate(T entity);

	/**
	 * 删除entity
	 */
	@Transactional
	<T extends Identifiable<?>> int delete(T entity);

	/**
	 * 批量删除entity
	 */
	@Transactional
	<T extends Identifiable<?>> int delete(T[] entities);

	/**
	 * 批量删除entity
	 */
	@Transactional
	<T extends Identifiable<?>> int delete(Collection<T> entities);

	/**
	 * 根据id删除该id对应的entity
	 */
	@Transactional
	<P extends Serializable, T extends Identifiable<P>> int deleteById(Class<T> clazz, P id);

	/**
	 * 批量根据id删除该id对应的entity
	 */
	@Transactional
	<P extends Serializable, T extends Identifiable<P>> int deleteById(Class<T> clazz, P[] ids);

	/**
	 * 批量根据id删除该id对应的entity
	 */
	@Transactional
	<P extends Serializable, T extends Identifiable<P>> int deleteById(Class<T> clazz, Collection<P> ids);

	/**
	 * example query
	 * 
	 * @param example
	 * @return
	 */
	<T extends Identifiable<?>> List<T> findByExample(T example);

}
